Unityのバッチビルド時にコンパイラディレクティブを渡す


概要

手段を探した。エディタ、プレイヤー両方あるいは片方で任意のものを外部から入力できねーかなーと思っていた。



公式ドキュメント曰く

Platform dependent compilation

https://docs.unity3d.com/Manual/PlatformDependentCompilation.html



末尾の方に各種rspファイルとその内容でのディレクティブの設定方法が書いてある。


で、gmcs.rspファイルを生成して、特定の記法でビルドに使われるフラグを定義できる。

さらにこれらの.rspはコマンドラインで実行する際にもちゃんと作用している。



試行錯誤

例えば下記のフラグをコマンドライン実行時に付与したい。

CLOUDBUILD

この場合、gmcs.rspファイルには下記を入れればいい。


gmcs.rsp

-define:CLOUDBUILD


のだけれど、例えばこのファイルを置きっぱなしにしてしまうと、ビルド時にずっとそのフラグがセットされた状態になってしまう。

それは嬉しくないので、

・内容を変更する(ファイルごと消すとか

ということを毎回ちゃんとやりたい。



しかもこのgmcs.rspを使った方法、割と癖があって、

・gmcs.rspの内容を変更しても、コンパイル対象のスクリプト自体に変更がないと、反映されない

のだった。マジか。


このフラグ周りについてコンパイル後に手をだすことはできない(そもそもコンパイル自体に影響するパラメータだこれ)ため、

次のような手段を用いてみた。


1.gmcs.rspファイルを生成する

2.gmcs.rspファイルに使いたいフラグを書き込む

3.trigger.csファイルを生成する

4.trigger.csファイルの中身をランダムかつ適当に用意する(秒まである日付とかがベスト

5.コマンドラインでUnityプロジェクトをビルド(-quitオプション付きで完了後に自動終了

6.gmcs.rspファイルとtrigger.csファイルを消す


こうすると、連続してコマンドラインビルドを行なった場合でも、常に最新の内容のgmcs.rspの内容のフラグを反映させることができる。


また、gmcs.rspファイルそれ自体が必要ない場合に対しても対応できる


(ただし既存のgmcs.rspファイルを消してしまうという害がある



実コードはこちら

こんな感じ。

# update defines.

echo -define:CLOUDBUILD > ./Assets/gmcs.rsp


# update date.

DATE=`date +%Y-%m-%d:%H:%M:%S`

echo //${DATE} > ./Assets/MiyamasuTestRunner/Editor/Timestamp.cs


# unity build.

/Applications/Unity/Unity.app/Contents/MacOS/Unity -batchmode -quit -projectPath $(pwd) -executeMethod Miyamasu.MiyamasuTestIgniter.CloudBuildTest


# delete.

rm ./Assets/gmcs.rsp

rm ./Assets/MiyamasuTestRunner/Editor/Timestamp.cs



とりあえずmiyamasuではこの方式を使って、手元で簡単にコンパイラディレクティブ渡してビルドしていろいろ試してる。